package com.quark.web.ui.field;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.quark.data.type.QuarkPair;
import com.quark.framework.ormapping.QuarkOrmEntity;
import com.quark.framework.utility.QuarkLog;
import com.quark.framework.utility.QuarkUtilStringTools;
import com.quark.web.ui.base.QuarkUiElementBase;
import com.quark.web.ui.base.QuarkUiSetting;
import com.quark.web.ui.base.QuarkUiTableElement;
import com.quark.web.ui.base.QuarkUiTrElement;

public class QuarkUiValueTableField extends QuarkUiFieldBase {

	List<QuarkPair<String, Class<? extends QuarkUiFieldBase>>> subFieldList = 
		new ArrayList<QuarkPair<String, Class<? extends QuarkUiFieldBase>>>();
	List<QuarkUiFieldBase> list = new ArrayList<QuarkUiFieldBase>();
	
	QuarkUiTableElement element = null;
	QuarkUiTrElement sampleRow = null;
	boolean hasSetValue = false;
	String trTagName = "samplerow";
	String tableName = "";
	String value = "";
	public QuarkUiValueTableField(String fieldName) {
		super(fieldName, new QuarkUiTableElement(fieldName, fieldName, QuarkUiSetting.TABLE_CLASS, ""));
		tableName = fieldName;
		// TODO Auto-generated constructor stub
		// TODO Add a attribute for javascript to identify
		element = (QuarkUiTableElement) super.elementBase;
		rowspan = 2;
	}

	public boolean AddSubField(QuarkUiFieldBase uiClass)
	{
		if(uiClass == null)
		{
			QuarkLog.logError("QuarkUiValueTableField.AddSubField: create field failed.");
			return false;
		}
		subFieldList.add(new QuarkPair<String, Class<? extends QuarkUiFieldBase>>(uiClass.getName(), uiClass.getClass()));
		list.add(uiClass);
		return true;
	}
	
	public QuarkUiFieldBase getSubField(String fieldName)
	{
		for(Iterator<QuarkUiFieldBase> it = list.iterator(); it.hasNext();)
		{
			QuarkUiFieldBase field = it.next();
			if(field.getName().equals(fieldName))
			{
				return field;
			}
		}
		return null;
	}
	
	public String createField()
	{
		if(!hasSetValue)
		{
			sampleRow = new QuarkUiTrElement("", "", "", "");
			sampleRow.addAttribute("Addable", "name:'" + tableName + "',value:'" + QuarkUtilStringTools.escapeHtmlAttributeX(value) + "'");
			for(QuarkUiFieldBase it : list)
			{
				sampleRow.addTd(it.createField(), 1, 1);
			}
			element.addTableRow(sampleRow);			
		}
		QuarkLog.logDebug(QuarkUtilStringTools.escapeHtmlAttributeX(value));
		return element.createElement();
	}
	
	public void clearField()
	{
		element.clearTr();
	}
	
	public boolean fillFieldWith(Object param)
	//Accept List<Map<String, Object>> / List<Object[]> / Object[][] / String 
	{
		value = (String) param;
//		if(param == null)
//		{
//			QuarkLog.logError(getClass().getName(), " can't fill with null");
//			clearField();
//			return false;
//		}
//		element.clearTr();
//		Object[] array1 = null;
//		boolean listParse = false;
//		if(param.getClass().equals(List.class))
//		{
//			List<?> testList = (List<?>)param;
//			if(!testList.isEmpty() && testList.get(0).getClass().isArray())
//			{
//				listParse = true;
//				array1 = testList.toArray();
//			}
//		}
//		if(param.getClass().isArray() || param.getClass().equals(String.class) || listParse)
//			//parse as object[][]
//		{
//			
//			if(param.getClass().equals(String.class))
//			{
//				String[] firstBreak = param.toString().split(QuarkUtilStringTools.firstArraySplitor);
//				array1 = new Object[firstBreak.length];
//				for(int i = 0; i < firstBreak.length; i ++)
//				{
//					String[] secondBreak = firstBreak[i].split(QuarkUtilStringTools.secondArraySplitor);
//					array1[i] = secondBreak; 
//				}
//			}
//			else if(!listParse)
//			{
//				array1 = (Object[])param;
//			}
//			
///*			if(!array1.getClass().getComponentType().isArray())
//			{
//				QuarkLog.logError(
//						getClass().getName(), 
//						"can't parse " + 
//						array1.getClass().getComponentType().getName() + 
//						"[], " + 
//						Object.class.getName() + 
//						"[][] expected"
//						);
//				return false;
//			}*/
//
//			for(Object i : array1)
//			{
//				sampleRow = new QuarkUiTrElement("","","","");
//				Object[] array2 = (Object[]) i;
//				if(array2.length != list.size())
//				{
//					String dumpValue = "";
//					for(Object j : array2)
//					{
//						dumpValue += j.toString() + " ";
//					}
//					QuarkLog.logError(
//							getClass().getName(), 
//							"can't fill field with \"" + 
//							dumpValue + 
//							"\", value count " + 
//							array2.length + 
//							" != sub field count " + 
//							list.size()
//							);
//					continue;
//				}
//				else
//				{
//					for(int j = 0; j < list.size(); j ++)
//					{
//						list.get(j).fillFieldWith(array2[j]);
//						sampleRow.addTd(list.get(j).createField(), 1, 1);
//					}
//					element.addTableRow(sampleRow);
//				}
//			}
//		}
//		else if(param.getClass().equals(List.class))
//		{
//			List<?> paramList = (List<?>)param;
//			if(paramList.isEmpty())
//			{
//				QuarkLog.logError(getClass().getName(), "can't fill with empty list");
//				return false;
//			}
//			if(!paramList.get(0).getClass().equals(Map.class))
//			{
//				QuarkLog.logError(
//						getClass().getName(), 
//						"can't parse List<" + 
//						paramList.get(0).getClass().getName() + 
//						">, List<" + 
//						Map.class.getName() + 
//						"<String, Object>> expected"
//						);
//				return false;
//			}
//			for(Object i : paramList)
//			{
//				Map<?, ?> map = (Map<?, ?>)i;
//				Iterator<?> keys = map.keySet().iterator();
//				boolean failed = false;
//				sampleRow.clearTd();
//				while(keys.hasNext())
//				{
//					String key = keys.next().toString();
//					QuarkUiFieldBase item = null;
//					for(int j = 0; j < list.size(); j ++)
//					{
//						if(list.get(j).name.equalsIgnoreCase(key))
//						{
//							item = list.get(j);
//							break;
//						}
//					}
//					if(item != null)
//					{
//						item.clearField();
//						if(item.fillFieldWith(map.get(key)))
//						{
//							QuarkLog.logError(getClass().getName(), "sub field " + key + " fill failed");
//							failed = true;
//						}
//					}
//				}
//				if(!failed)
//				{
//					for(QuarkUiFieldBase j : list)
//					{
//						sampleRow.addTd(j.createField(), 1, 1);
//					}					
//				}
//				element.addTableRow(sampleRow);
//			}
//		}
//		hasSetValue = true;
		return true;
	}
	
	public Object processSubmitData(Object rawData)
	//Accept name=value,name=value,name=value;...
	//return List<Map<String, String>>
	{
		List<Map<String, String>> ret = new ArrayList<Map<String, String>>();
		String[] array = rawData.toString().split(QuarkUtilStringTools.firstArraySplitor);
		for(String i : array)
		{
			String[] patterns = i.split(QuarkUtilStringTools.secondArraySplitor);
			Map<String, String> map = new HashMap<String, String>();
			for(String j : patterns)
			{
				String[] pattern = j.split("=");
				String value = pattern.length > 1 ? pattern[1] : "";
				map.put(pattern[0], value);
			}
			ret.add(map);
		}
		return ret;
	}
	
	public Integer getSubFieldCount()
	{
		return list.size();
	}
}
